package org.csy.generic.test06;

import java.util.ArrayList;
import java.util.List;

/**
 * 型变
 *  1）不变：赋值运行符左右两边的泛型必须一致
 *
 *  2）协变：子类型的泛型可以赋值给父类型的泛型 - 通配符
 *   类<? extends 父类> 对象 = new 类<子类>()
 *   ArrayList<? extends Animal> list = new ArrayList<Cat>();
 *
 *  3）逆变：父类型的泛型可以赋值给子类型的泛型 - 通配符
 *  类<? super 子类> 对象 = new 类<父类>()
 *
 * @author CSY
 * @date 2025 - 03 - 27
 */
public class MainTest04 {
    public static void main(String[] args) {
        //泛型的逆变性
        List<? super Dog> list = new ArrayList<Animal>();
        //逆变可以使用含有泛型参数的方法 - 与协变的区别
        list.add(new Dog());
        list.add(new Dog());
        list.add(new Dog());

        //强转读取指定类型数据
        Dog dog = (Dog)list.get(0);
        System.out.println(dog);

        //使用Object获取数据
        Object o = list.get(1);

        System.out.println(list.size());
    }
}
